package com.cskaoyan.object;


import java.util.Objects;

/*
      public boolean equals(Object obj)
        指示其他某个对象是否与此对象“相等”。
        a. 其他对象指方法接受的参数对象
        b. 此对象即当前对象

      如何理解对象相等？
      a. 我们仍然可以从对象的差异性的角度理解对象相等，对象没有差异，就相等了
      b. 同种类型的对象，如果成员变量值也相同，我们可以认为这两个对象相等
      c. 不同类型的对象，肯定不相等


      Object 类的 equals 方法实现对象上差别可能性最大的相等关系；
          即，对于任何非空引用值 x 和 y，当且仅当 x 和 y 引用同一个对象时，此方法才返回 true，效果等价于 x == y



      equals 方法在非空对象引用上实现相等关系：
        自反性：对于任何非空引用值 x，x.equals(x) 都应返回 true。
        对称性：对于任何非空引用值 x 和 y，当且仅当 y.equals(x) 返回 true 时，x.equals(y) 才应返回 true。
        传递性：对于任何非空引用值 x、y 和 z，如果 x.equals(y) 返回 true，并且 y.equals(z) 返回 true，那么 x.equals(z) 应返回 true。
        一致性：
            a. 对于任何非空引用值 x 和 y，多次调用 x.equals(y) 始终返回 true 或始终返回 false
            b. 前提是对象上 equals 比较中所用的信息没有被修改。
               这里的equals比较所用的信息：指的就是对象的成员变量值
        对于任何非空引用值 x，x.equals(null) 都应返回 false。
 */
public class Demo1Equals {

    public static void main(String[] args) {

        // 第一个EqualsClass对象
        int a1 = 10;
        double d1 = 5.5;
        EqualsClass first = new EqualsClass(a1, d1);

        // 第二个EqualsClass对象
        int a2 = 10;
        double d2 = 5.5;
        EqualsClass second = new EqualsClass(a2, d2);

        // 比较
        boolean equals = first.equals(second);
        System.out.println(equals);
        // Object默认实现的equals方法效果等价与 ==
        System.out.println(first == second);

        // 相等
        System.out.println(first == first);
        System.out.println(first.equals(first));


    }
}

class EqualsClass {

    int a;
    double d;

    public EqualsClass(int a, double d) {
        this.a = a;
        this.d = d;
    }

//    @Override
//    public boolean equals(Object obj) {
//        if (this == obj) {
//            // 自己和自己比
//            return true;
//        }
//
//        // 考虑obj是null，以及两对象类型不同的情况
//        if (obj == null || this.getClass() != obj.getClass()) {
//            return false;
//        }
//
//        // 如果代码走到这里说明，待比较的两个对象是相同类型的对象
//        EqualsClass that = (EqualsClass) obj;
//        // 比较a成员变量值
//        if (this.a != that.a) {
//            return false;
//        }
//
//        // 比较d成员变量值
//        //  当且仅当，compare方法返回的结果是0的时候，表示两小数相等
//        return Double.compare(this.d, that.d) == 0;
//    }

    // alt + insert 帮助生成equals方法

}
